﻿/**
 * 此类型主要对 ExtJs 未编码的参数进行 JSON 编码，以及对读取操作的参数进行重新组织。
 * 
 * ASP.NET MVC中的控制器类型只要继承了 Happy.Web.Mvc.AjaxController，那么该控制器的默认
 *　Binder 就是 Happy.Web.Mvc.Newtonsoft.NewtonsoftJsonBinder，所有发送到这些控制器的参
 * 数都要使用 JSON 格式。
 */
Ext.define('Happy.data.proxy.Ajax', {
    extend: 'Ext.data.proxy.Ajax',
    alias: 'proxy.happy-ajax',
    requires: ['Happy.override.data.writer.Json'],

    /**
     * @cfg {String} 重写 ExtJs。
     */
    idParam: 'Id',

    /**
     * 重写 ExtJs。
     */
    reader: {
        type: 'json',
        root: 'items',
        idProperty: 'Id',
        messageProperty: 'message'
    },
    /**
     * 重写 ExtJs。
     */
    writer: {
        type: 'json',
        encode: true,
        root: 'item'
    },

    /**
     * 重写 ExtJs。
     */
    buildRequest: function (operation) {
        var me = this;

        var request = me.callParent(arguments);

        // 因为服务器使用了 NewtonsoftJsonBinder，必须对 request.params[me.idParam] 进行编码。
        if (request.params[me.idParam]) {
            request.params[me.idParam] = Ext.encode(request.params[me.idParam]);
        }

        return request;
    },

    /**
     * 重写 ExtJs。
     */
    getParams: function (operation) {
        var me = this;

        var params = me.callParent(arguments);

        if (operation.action === 'read') {
            var args;

            if (operation.arguments && operation.arguments.length > 0) {
                args = Ext.Array.map(operation.arguments, function (arg) {
                    return {
                        Property: arg.property,
                        Value: {
                            DataType: arg.dataType,
                            Value: arg.value
                        }
                    }
                });
            }

            params.query = Ext.encode({
                Columns: operation.columns,
                Arguments: args,
                Page: params.page,
                ItemsPerPage: params.limit
            });

            delete params.start;
            delete params.page;
            delete params.limit;
        }

        // TODO:JS 调试日志。
        console.log(operation);
        console.log(params);

        return params;
    }
});